package com.cy.pj.notice.web.controller;

import com.cy.pj.common.PageUtil;
import com.cy.pj.notice.pojo.SysNotice;
import com.cy.pj.notice.service.SysNoticeService;
import com.cy.pj.notice.web.pojo.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 公告模块控制层处理对象
 *1 请求url设计
 * 条件查询(请求方式-get请求,,请求url-  "/notice/")
 * 2新增设计
 * 新增(请求方式:Post请求,请求url-  "/notice/")
 * 3基于id查询
 * 查询(请求查询:get请求  请求url  "/notice/{id}")
 */

/**
 * ▪ 请求 url 设计
 * 1) 普通风格：/notice/doFindById
 * 2) Rest 风格：/notice/doFindById/{id}
 * ▪ 请求方式设计
 * 1) @RequestMapping (通用，适配所有请求方式)
 * 2) @GetMapping(处理 Get 请求，主要应用于查询)
 * 3) @PostMapping(处理 post 请求，主要应用于新增操作)
 * 4) @PutMapping(处理 put 请求，主要应用于更新操作)
 * 5) @DeleteMapping(处理 delete 请求，主要应用于删除操作)
 * ▪ 请求方法参数类型设计
 * 1) 直接量（8 中基本数据类型+String+Date+数组）
 * 2) Pojo 对象（必须提供 set 方法）
 * 3) Map 对象（必须使用@RequestParam 或@RequestBody 注解描述）
 * ▪ 请求方法参数描述设计
 * 1) @RequestParam（对传统风格 url 参数，请求方法中的 map 参数进行描述）
 * 2) @RequestBody (将客户端 post 请求的 json 值赋值给 pojo 或 map 参数)
 * 3) @PathVariable (从 rest 风格 url 中取{}变量的值注入给参数)
 * 4) @DateTimeFormat (假如是 pojo 参数，可以直接描述 pojo 日期属性)
 * ▪ 响应结果封装及转换
 * 1) 响应结果要做统一封装。
 * 2) @ResponseBody（尽量将响应结果转换为 json 格式）
 * 3) @JsonFormat(描述 pojo 属性或 get 方法，转 json 时按指定格式转换)
 */



@RestController
@RequestMapping("/notice")
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;


    //接收来自客户端的参数pojo,notice.进行查询
    //请求url:http://localhost/notice/
    //请求url:http://localhost/notice/?type=1&title=my  传值
    //GetMapping专门处理查询数据
    @GetMapping
    public JsonResult doFindNotices(SysNotice notice) {
        /**启动分页查询;
         *执行查询;
         *当接口中只有一个方法时可以使用lambma表达式
         */

        return new JsonResult(PageUtil.startPage()
                .doSelectPageInfo(()-> sysNoticeService.findNotices(notice)));

//        return new JsonResult(PageHelper.startPage(1,3)
//                .doSelectPageInfo(()-> {
//                    sysNoticeService.findNotices(notice);
//                }));


//        PageInfo<SysNotice> pageInfo = JsonResult(PageHelper.startPage(1,3)
//                .doSelectPageInfo(new ISelect() {
//                    @Override
//                    public void doSelect() {
//                    sysNoticeService.findNotices(notice);
//                    }
//                }));
//       return new JsonResult(pageInfo);

    }
    //新增的公告信息                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      0
    //@Requestbody 客户端可以向服务端传递json格式的字符串参数;
    //服务器拿到字符串以后会将json字符串转为参数类型的对象;(json反序列化)
    //一个方法中只允许有一个参数使用@RequestBody注解;
    @PostMapping
    public JsonResult doSaveNotice(@RequestBody SysNotice notice) {
        sysNoticeService.saveNotice(notice);
        return new JsonResult("save ok");  //json序列化(将java对象转化为json字符串)
    }

    /**
     * rest风格的url变量需要使用{}括起来
     * 在方法中需要设置这个变量的值可以使用@PathVariable对参数进行描述
     * @param id
     * @return
     */

    @GetMapping("{id}")
    public JsonResult doFindById(@PathVariable Long id){
        return new JsonResult(sysNoticeService.findById(id));
    }
    @PutMapping
    public JsonResult doUpdateNotice(SysNotice notice){
        sysNoticeService.updateNotice(notice);
        return new JsonResult("update ok");
    }
    @DeleteMapping("{ids}")
    public JsonResult doDeleteById(@PathVariable Long... ids){
        sysNoticeService.deleteById(ids);
//        try {
            return new JsonResult("delete ok");
//        }catch (Exception   e){
//            return new JsonResult(e);
//        }
    }


}
